#pragma once

#include "StrTraits.h"

namespace Str
{

void _AppendFormat(std::string& str, LPCSTR lpFormat, ...);
void _AppendFormat(std::wstring& str, LPCWSTR lpFormat, ...);
void AppendFormatV(std::string& str, LPCSTR lpFormat, va_list args);
void AppendFormatV(std::wstring& str, LPCWSTR lpFormat, va_list args);

template<typename S, typename... Args>
void AppendFormat(S& str, Args&&... args)
{
	_AppendFormat(str, TypeCheck<S::value_type>(TypeCast(std::forward<Args>(args)))...);
}

template<typename S, typename... Args>
void Format(S& str, Args&&... args)
{
	str.clear();
	AppendFormat(str, std::forward<Args>(args)...);
}

template<typename S, typename T>
void FormatV(S& str, const T *lpFormat, va_list args)
{
	str.clear();
	AppendFormatV(str, lpFormat, args);
}

std::string Unicode2ANSI(const std::wstring_view& str);
std::wstring ANSI2Unicode(const std::string_view& str);
std::string Unicode2UTF8(const std::wstring_view& str);
std::wstring UTF82Unicode(const std::string_view& str);

std::wstring StringToLower(std::wstring str);

}	// namespace Str
